home *** CD-ROM | disk | FTP | other *** search
/ Personal Computer World 2009 February / PCWFEB09.iso / Software / Linux / Kubuntu 8.10 / kubuntu-8.10-desktop-i386.iso / casper / filesystem.squashfs / usr / share / perl5 / Debconf / ConfModule.pm < prev    next >
Text File  |  2008-10-10  |  16KB  |  669 lines

  1. #!/usr/bin/perl -w
  2. # This file was preprocessed, do not edit!
  3.  
  4.  
  5. package Debconf::ConfModule;
  6. use strict;
  7. use IPC::Open2;
  8. use FileHandle;
  9. use Debconf::Gettext;
  10. use Debconf::Config;
  11. use Debconf::Question;
  12. use Debconf::Priority qw(priority_valid high_enough);
  13. use Debconf::FrontEnd::Noninteractive;
  14. use Debconf::Log ':all';
  15. use Debconf::Encoding;
  16. use base qw(Debconf::Base);
  17.  
  18.  
  19. my %codes = (
  20.     success => 0,
  21.     escaped_data => 1,
  22.     badparams => 10,
  23.     syntaxerror => 20,
  24.     input_invisible => 30,
  25.     version_bad => 30,
  26.     go_back => 30,
  27.     progresscancel => 30,
  28.     internalerror => 100,
  29. );
  30.  
  31.  
  32. sub init {
  33.     my $this=shift;
  34.  
  35.     $this->version("2.0");
  36.     
  37.     $this->owner('unknown') if ! defined $this->owner;
  38.     
  39.     $this->frontend->capb_backup('');
  40.  
  41.     $this->seen([]);
  42.     $this->busy([]);
  43.  
  44.     $ENV{DEBIAN_HAS_FRONTEND}=1;
  45. }
  46.  
  47.  
  48. sub startup {
  49.     my $this=shift;
  50.     my $confmodule=shift;
  51.  
  52.     $this->frontend->clear;
  53.     $this->busy([]);
  54.     
  55.     my @args=$this->confmodule($confmodule);
  56.     push @args, @_ if @_;
  57.     
  58.     debug developer => "starting ".join(' ',@args);
  59.     $this->pid(open2($this->read_handle(FileHandle->new),
  60.                  $this->write_handle(FileHandle->new),
  61.              @args)) || die $!;
  62.         
  63.     $this->caught_sigpipe('');
  64.     $SIG{PIPE}=sub { $this->caught_sigpipe(128) };
  65. }
  66.  
  67.  
  68. sub communicate {
  69.     my $this=shift;
  70.  
  71.     my $r=$this->read_handle;
  72.     $_=<$r> || return $this->finish;
  73.     chomp;
  74.     my $ret=$this->process_command($_);
  75.     my $w=$this->write_handle;
  76.     print $w $ret."\n";
  77.     return '' unless length $ret;
  78.     return 1;
  79. }
  80.  
  81.  
  82. sub escape {
  83.     my $text=shift;
  84.     $text=~s/\\/\\\\/g;
  85.     $text=~s/\n/\\n/g;
  86.     return $text;
  87. }
  88.  
  89.  
  90. sub unescape_split {
  91.     my $text=shift;
  92.     my @words;
  93.     my $word='';
  94.     for my $chunk (split /(\\.|\s+)/, $text) {
  95.         if ($chunk eq '\n') {
  96.             $word.="\n";
  97.         } elsif ($chunk=~/^\\(.)$/) {
  98.             $word.=$1;
  99.         } elsif ($chunk=~/^\s+$/) {
  100.             push @words, $word;
  101.             $word='';
  102.         } else {
  103.             $word.=$chunk;
  104.         }
  105.     }
  106.     push @words, $word if $word ne '';
  107.     return @words;
  108. }
  109.  
  110.  
  111. sub process_command {
  112.     my $this=shift;
  113.     
  114.     debug developer => "<-- $_";
  115.     return 1 unless defined && ! /^\s*#/; # Skip blank lines, comments.
  116.     chomp;
  117.     my ($command, @params);
  118.     if (defined $this->client_capb and grep { $_ eq 'escape' } @{$this->client_capb}) {
  119.         ($command, @params)=unescape_split($_);
  120.     } else {
  121.         ($command, @params)=split(' ', $_);
  122.     }
  123.     $command=lc($command);
  124.     if (lc($command) eq "stop") {
  125.         return $this->finish;
  126.     }
  127.     if (! $this->can("command_$command")) {
  128.         return $codes{syntaxerror}.' '.
  129.                "Unsupported command \"$command\" (full line was \"$_\") received from confmodule.";
  130.     }
  131.     $command="command_$command";
  132.     my $ret=join(' ', $this->$command(@params));
  133.     debug developer => "--> $ret";
  134.     if ($ret=~/\n/) {
  135.         debug developer => 'Warning: return value is multiline, and would break the debconf protocol. Truncating to first line.';
  136.         $ret=~s/\n.*//s;
  137.         debug developer => "--> $ret";
  138.     }
  139.     return $ret;
  140. }
  141.  
  142.  
  143. sub finish {
  144.     my $this=shift;
  145.  
  146.     waitpid $this->pid, 0 if defined $this->pid;
  147.     $this->exitcode($this->caught_sigpipe || ($? >> 8));
  148.  
  149.     $SIG{PIPE} = sub {};
  150.     
  151.     foreach (@{$this->seen}) {
  152.         my $q=Debconf::Question->get($_->name);
  153.         $_->flag('seen', 'true') if $q;
  154.     }
  155.     $this->seen([]);
  156.     
  157.     return '';
  158. }
  159.  
  160.  
  161. sub command_input {
  162.     my $this=shift;
  163.     return $codes{syntaxerror}, "Incorrect number of arguments" if @_ != 2;
  164.     my $priority=shift;
  165.     my $question_name=shift;
  166.     
  167.     my $question=Debconf::Question->get($question_name) ||
  168.         return $codes{badparams}, "\"$question_name\" doesn't exist";
  169.  
  170.     if (! priority_valid($priority)) {
  171.         return $codes{syntaxerror}, "\"$priority\" is not a valid priority";
  172.     }
  173.  
  174.     $question->priority($priority);
  175.     
  176.     my $visible=1;
  177.  
  178.     if ($question->type ne 'error') {
  179.         $visible='' unless high_enough($priority);
  180.  
  181.         $visible='' if ! Debconf::Config->reshow &&
  182.                    $question->flag('seen') eq 'true';
  183.     }
  184.  
  185.     my $markseen=$visible;
  186.  
  187.     if ($visible && ! $this->frontend->interactive) {
  188.         $visible='';
  189.         $markseen='' unless Debconf::Config->noninteractive_seen eq 'true';
  190.     }
  191.  
  192.     my $element;
  193.     if ($visible) {
  194.         $element=$this->frontend->makeelement($question);
  195.         unless ($element) {
  196.             return $codes{internalerror},
  197.                    "unable to make an input element";
  198.         }
  199.  
  200.         $visible=$element->visible;
  201.     }
  202.  
  203.     if (! $visible) {
  204.         $element=Debconf::FrontEnd::Noninteractive->makeelement($question, 1);
  205.  
  206.         return $codes{input_invisible}, "question skipped" unless $element;
  207.     }
  208.  
  209.     $element->markseen($markseen);
  210.  
  211.     push @{$this->busy}, $question_name;
  212.     
  213.     $this->frontend->add($element);
  214.     if ($element->visible) {
  215.         return $codes{success}, "question will be asked";
  216.     }
  217.     else {
  218.         return $codes{input_invisible}, "question skipped";
  219.     }
  220. }
  221.  
  222.  
  223. sub command_clear {
  224.     my $this=shift;
  225.     return $codes{syntaxerror}, "Incorrect number of arguments" if @_ != 0;
  226.  
  227.     $this->frontend->clear;
  228.     $this->busy([]);
  229.     return $codes{success};
  230. }
  231.  
  232.  
  233. sub command_version {
  234.     my $this=shift;
  235.     return $codes{syntaxerror}, "Incorrect number of arguments" if @_ > 1;
  236.     my $version=shift;
  237.     if (defined $version) {
  238.         return $codes{version_bad}, "Version too low ($version)"
  239.             if int($version) < int($this->version);
  240.         return $codes{version_bad}, "Version too high ($version)"
  241.             if int($version) > int($this->version);
  242.     }
  243.     return $codes{success}, $this->version;
  244. }
  245.  
  246.  
  247. sub command_capb {
  248.     my $this=shift;
  249.     $this->client_capb([@_]);
  250.     $this->frontend->capb_backup(1) if grep { $_ eq 'backup' } @_;
  251.     my @capb=('multiselect', 'escape');
  252.     push @capb, $this->frontend->capb;
  253.     return $codes{success}, @capb;
  254. }
  255.  
  256.  
  257. sub command_title {
  258.     my $this=shift;
  259.     $this->frontend->title(join ' ', @_);
  260.     $this->frontend->requested_title($this->frontend->title);
  261.  
  262.     return $codes{success};
  263. }
  264.  
  265.  
  266. sub command_settitle {
  267.     my $this=shift;
  268.     
  269.     return $codes{syntaxerror}, "Incorrect number of arguments" if @_ != 1;
  270.     my $question_name=shift;
  271.     
  272.     my $question=Debconf::Question->get($question_name) ||
  273.         return $codes{badparams}, "\"$question_name\" doesn't exist";
  274.  
  275.     if ($this->frontend->can('settitle')) {
  276.         $this->frontend->settitle($question);
  277.     } else {
  278.         $this->frontend->title($question->description);
  279.     }
  280.     $this->frontend->requested_title($this->frontend->title);
  281.     
  282.     return $codes{success};
  283. }
  284.  
  285.  
  286. sub command_beginblock {
  287.     return $codes{success};
  288. }
  289. sub command_endblock {
  290.     return $codes{success};
  291. }
  292.  
  293.  
  294. sub command_go {
  295.     my $this=shift;
  296.     return $codes{syntaxerror}, "Incorrect number of arguments" if @_ > 0;
  297.  
  298.     my $ret=$this->frontend->go;
  299.     if ($ret && (! $this->backed_up ||
  300.                  grep { $_->visible } @{$this->frontend->elements})) {
  301.         foreach (@{$this->frontend->elements}) {
  302.             $_->question->value($_->value);
  303.             push @{$this->seen}, $_->question if $_->markseen && $_->question;
  304.         }
  305.         $this->frontend->clear;
  306.         $this->busy([]);
  307.         $this->backed_up('');
  308.         return $codes{success}, "ok"
  309.     }
  310.     else {
  311.         $this->frontend->clear;
  312.         $this->busy([]);
  313.         $this->backed_up(1);
  314.         return $codes{go_back}, "backup";
  315.     }
  316. }
  317.  
  318.  
  319. sub command_get {
  320.     my $this=shift;
  321.     return $codes{syntaxerror}, "Incorrect number of arguments" if @_ != 1;
  322.     my $question_name=shift;
  323.     my $question=Debconf::Question->get($question_name) ||
  324.         return $codes{badparams}, "$question_name doesn't exist";
  325.  
  326.     if (defined $question->value) {
  327.         if (defined $this->client_capb and grep { $_ eq 'escape' } @{$this->client_capb}) {
  328.             return $codes{escaped_data}, escape($question->value);
  329.         } else {
  330.             return $codes{success}, $question->value;
  331.         }
  332.     }
  333.     else {
  334.         return $codes{success}, '';
  335.     }
  336. }
  337.  
  338.  
  339. sub command_set {
  340.     my $this=shift;
  341.     return $codes{syntaxerror}, "Incorrect number of arguments" if @_ < 1;
  342.     my $question_name=shift;
  343.     my $value=join(" ", @_);
  344.  
  345.     my $question=Debconf::Question->get($question_name) ||
  346.         return $codes{badparams}, "$question_name doesn't exist";
  347.     $question->value($value);
  348.     return $codes{success}, "value set";
  349. }
  350.  
  351.  
  352. sub command_reset {
  353.     my $this=shift;
  354.     return $codes{syntaxerror}, "Incorrect number of arguments" if @_ != 1;
  355.     my $question_name=shift;
  356.  
  357.     my $question=Debconf::Question->get($question_name) ||
  358.         return $codes{badparams}, "$question_name doesn't exist";
  359.     $question->value($question->default);
  360.     $question->flag('seen', 'false');
  361.     return $codes{success};
  362. }
  363.  
  364.  
  365. sub command_subst {
  366.     my $this = shift;
  367.     return $codes{syntaxerror}, "Incorrect number of arguments" if @_ < 2;
  368.     my $question_name = shift;
  369.     my $variable = shift;
  370.     my $value = (join ' ', @_);
  371.     
  372.     my $question=Debconf::Question->get($question_name) ||
  373.         return $codes{badparams}, "$question_name doesn't exist";
  374.     my $result=$question->variable($variable,$value);
  375.     return $codes{internalerror}, "Substitution failed" unless defined $result;
  376.     return $codes{success};
  377. }
  378.  
  379.  
  380. sub command_register {
  381.     my $this=shift;
  382.     return $codes{syntaxerror}, "Incorrect number of arguments" if @_ != 2;
  383.     my $template=shift;
  384.     my $name=shift;
  385.     
  386.     my $tempobj = Debconf::Question->get($template);
  387.     if (! $tempobj) {
  388.         return $codes{badparams}, "No such template, \"$template\"";
  389.     }
  390.     my $question=Debconf::Question->get($name) || 
  391.                  Debconf::Question->new($name, $this->owner, $tempobj->type);
  392.     if (! $question) {
  393.         return $codes{internalerror}, "Internal error making question";
  394.     }
  395.     if (! defined $question->addowner($this->owner, $tempobj->type)) {
  396.         return $codes{internalerror}, "Internal error adding owner";
  397.     }
  398.     if (! $question->template($template)) {
  399.         return $codes{internalerror}, "Internal error setting template";
  400.     }
  401.  
  402.     return $codes{success};
  403. }
  404.  
  405.  
  406. sub command_unregister {
  407.     my $this=shift;
  408.     return $codes{syntaxerror}, "Incorrect number of arguments" if @_ != 1;
  409.     my $name=shift;
  410.     
  411.     my $question=Debconf::Question->get($name) ||
  412.         return $codes{badparams}, "$name doesn't exist";
  413.     if (grep { $_ eq $name } @{$this->busy}) {
  414.         return $codes{badparams}, "$name is busy, cannot unregister right now";
  415.     }
  416.     $question->removeowner($this->owner);
  417.     return $codes{success};
  418. }
  419.  
  420.  
  421. sub command_purge {
  422.     my $this=shift;
  423.     return $codes{syntaxerror}, "Incorrect number of arguments" if @_ > 0;
  424.     
  425.     my $iterator=Debconf::Question->iterator;
  426.     while (my $q=$iterator->iterate) {
  427.         $q->removeowner($this->owner);
  428.     }
  429.  
  430.     return $codes{success};
  431. }
  432.  
  433.  
  434. sub command_metaget {
  435.     my $this=shift;
  436.     return $codes{syntaxerror}, "Incorrect number of arguments" if @_ != 2;
  437.     my $question_name=shift;
  438.     my $field=shift;
  439.     
  440.     my $question=Debconf::Question->get($question_name) ||
  441.         return $codes{badparams}, "$question_name doesn't exist";
  442.     my $lcfield=lc $field;
  443.     my $fieldval=$question->$lcfield();
  444.     unless (defined $fieldval) {
  445.         return $codes{badparams}, "$field does not exist";
  446.     }
  447.     if (defined $this->client_capb and grep { $_ eq 'escape' } @{$this->client_capb}) {
  448.         return $codes{escaped_data}, escape($fieldval);
  449.     } else {
  450.         return $codes{success}, $fieldval;
  451.     }
  452. }
  453.  
  454.  
  455. sub command_fget {
  456.     my $this=shift;
  457.     return $codes{syntaxerror}, "Incorrect number of arguments" if @_ != 2;
  458.     my $question_name=shift;
  459.     my $flag=shift;
  460.     
  461.     my $question=Debconf::Question->get($question_name) ||
  462.         return $codes{badparams},  "$question_name doesn't exist";
  463.         
  464.     return $codes{success}, $question->flag($flag);
  465. }
  466.  
  467.  
  468. sub command_fset {
  469.     my $this=shift;
  470.     return $codes{syntaxerror}, "Incorrect number of arguments" if @_ < 3;
  471.     my $question_name=shift;
  472.     my $flag=shift;
  473.     my $value=(join ' ', @_);
  474.     
  475.     my $question=Debconf::Question->get($question_name) ||
  476.         return $codes{badparams}, "$question_name doesn't exist";
  477.  
  478.     if ($flag eq 'seen') {
  479.         $this->seen([grep {$_ ne $question} @{$this->seen}]);
  480.     }
  481.         
  482.     return $codes{success}, $question->flag($flag, $value);
  483. }
  484.  
  485.  
  486. sub command_info {
  487.     my $this=shift;
  488.  
  489.     if (@_ == 0) {
  490.         $this->frontend->info(undef);
  491.     } elsif (@_ == 1) {
  492.         my $question_name=shift;
  493.  
  494.         my $question=Debconf::Question->get($question_name) ||
  495.             return $codes{badparams}, "\"$question_name\" doesn't exist";
  496.  
  497.         $this->frontend->info($question);
  498.     } else {
  499.         return $codes{syntaxerror}, "Incorrect number of arguments";
  500.     }
  501.  
  502.     return $codes{success};
  503. }
  504.  
  505.  
  506. sub command_progress {
  507.     my $this=shift;
  508.     return $codes{syntaxerror}, "Incorrect number of arguments" if @_ < 1;
  509.     my $subcommand=shift;
  510.     $subcommand=lc($subcommand);
  511.     
  512.     my $ret;
  513.  
  514.     if ($subcommand eq 'start') {
  515.         return $codes{syntaxerror}, "Incorrect number of arguments" if @_ != 3;
  516.         my $min=shift;
  517.         my $max=shift;
  518.         my $question_name=shift;
  519.  
  520.         return $codes{syntaxerror}, "min ($min) > max ($max)" if $min > $max;
  521.  
  522.         my $question=Debconf::Question->get($question_name) ||
  523.             return $codes{badparams}, "$question_name doesn't exist";
  524.  
  525.         $this->frontend->progress_start($min, $max, $question);
  526.         $ret=1;
  527.     }
  528.     elsif ($subcommand eq 'set') {
  529.         return $codes{syntaxerror}, "Incorrect number of arguments" if @_ != 1;
  530.         my $value=shift;
  531.         $ret = $this->frontend->progress_set($value);
  532.     }
  533.     elsif ($subcommand eq 'step') {
  534.         return $codes{syntaxerror}, "Incorrect number of arguments" if @_ != 1;
  535.         my $inc=shift;
  536.         $ret = $this->frontend->progress_step($inc);
  537.     }
  538.     elsif ($subcommand eq 'info') {
  539.         return $codes{syntaxerror}, "Incorrect number of arguments" if @_ != 1;
  540.         my $question_name=shift;
  541.  
  542.         my $question=Debconf::Question->get($question_name) ||
  543.             return $codes{badparams}, "$question_name doesn't exist";
  544.  
  545.         $ret = $this->frontend->progress_info($question);
  546.     }
  547.     elsif ($subcommand eq 'stop') {
  548.         return $codes{syntaxerror}, "Incorrect number of arguments" if @_ != 0;
  549.         $this->frontend->progress_stop();
  550.         $ret=1;
  551.     }
  552.     else {
  553.         return $codes{syntaxerror}, "Unknown subcommand";
  554.     }
  555.  
  556.     if ($ret) {
  557.         return $codes{success}, "OK";
  558.     }
  559.     else {
  560.         return $codes{progresscancel}, "CANCELED";
  561.     }
  562. }
  563.  
  564.  
  565. sub command_data {
  566.     my $this=shift;
  567.     return $codes{syntaxerror}, "Incorrect number of arguments" if @_ < 3;
  568.     my $template=shift;
  569.     my $item=shift;
  570.     my $value=join(' ', @_);
  571.     $value=~s/\\([n"\\])/($1 eq 'n') ? "\n" : $1/eg;
  572.  
  573.     my $tempobj=Debconf::Template->get($template);
  574.     if (! $tempobj) {
  575.         if ($item ne 'type') {
  576.             return $codes{badparams}, "Template data field '$item' received before type field";
  577.         }
  578.         $tempobj=Debconf::Template->new($template, $this->owner, $value);
  579.         if (! $tempobj) {
  580.             return $codes{internalerror}, "Internal error making template";
  581.         }
  582.     } else {
  583.         if ($item eq 'type') {
  584.             return $codes{badparams}, "Template type already set";
  585.         }
  586.         $tempobj->$item(Debconf::Encoding::convert("UTF-8", $value));
  587.     }
  588.  
  589.     return $codes{success};
  590. }
  591.  
  592.  
  593. sub command_visible {
  594.     my $this=shift;
  595.     return $codes{syntaxerror}, "Incorrect number of arguments" if @_ != 2;
  596.     my $priority=shift;
  597.     my $question_name=shift;
  598.     
  599.     my $question=Debconf::Question->get($question_name) ||
  600.         return $codes{badparams}, "$question_name doesn't exist";
  601.     return $codes{success}, $this->frontend->visible($question, $priority) ? "true" : "false";
  602. }
  603.  
  604.  
  605. sub command_exist {
  606.     my $this=shift;
  607.     return $codes{syntaxerror}, "Incorrect number of arguments" if @_ != 1;
  608.     my $question_name=shift;
  609.     
  610.     return $codes{success}, 
  611.         Debconf::Question->get($question_name) ? "true" : "false";
  612. }
  613.  
  614.  
  615. sub command_x_loadtemplatefile {
  616.     my $this=shift;
  617.  
  618.     return $codes{syntaxerror}, "Incorrect number of arguments" if @_ < 1 || @_ > 2;
  619.  
  620.     my $file=shift;
  621.     my $fh=FileHandle->new($file);
  622.     if (! $fh) {
  623.         return $codes{badparams}, "failed to open $file: $!";
  624.     }
  625.  
  626.     my $owner=$this->owner;
  627.     if (@_) {
  628.         $owner=shift;
  629.     }
  630.  
  631.     eval {
  632.         Debconf::Template->load($fh, $owner);
  633.     };
  634.     if ($@) {
  635.         $@=~s/\n/\\n/g;
  636.         return $codes{internalerror}, $@;
  637.     }
  638.     return $codes{success};
  639. }
  640.  
  641.  
  642. sub AUTOLOAD {
  643.     (my $field = our $AUTOLOAD) =~ s/.*://;
  644.  
  645.     no strict 'refs';
  646.     *$AUTOLOAD = sub {
  647.         my $this=shift;
  648.         
  649.         return $this->{$field} unless @_;
  650.         return $this->{$field}=shift;
  651.     };
  652.     goto &$AUTOLOAD;
  653. }
  654.  
  655.  
  656. sub DESTROY {
  657.     my $this=shift;
  658.     
  659.     $this->read_handle->close if $this->read_handle;
  660.     $this->write_handle->close if $this->write_handle;
  661.     
  662.     if (defined $this->pid && $this->pid > 1) {
  663.         kill 'TERM', $this->pid;
  664.     }
  665. }
  666.  
  667.  
  668. 1
  669.